package org.example.inventory.dao.impl;


import org.example.inventory.dao.UserDao;
import org.example.inventory.entity.User;
import org.example.inventory.enums.UserRole;
import org.example.inventory.enums.UserStatus;
import org.example.inventory.exception.JdbcException;
import org.example.inventory.util.JdbcUtil;
import org.example.inventory.util.ResultSetHandler;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

public class UserDaoImpl implements UserDao {


    @Override
    public int insert(User user) {
//        String sql="insert into user (username,password,role,real_name,email,phone,status,create_time) value (?,?,?,?,?,?,?,?)";
//        //调用工具类的执行DML方法
//        //动态参数的个数要匹配问号的个数
//        return JdbcUtil.executeUpdate(sql,
//                user.getUsername(),
//                user.getPassword(),
//                //枚举需要在get后加.name()一次
//                user.getRole().name(),
//                user.getRealName(),
//                user.getEmail(),
//                user.getPhone(),
//                user.getStatus().name(),
//                user.getCreateTime());

            // 动态构建SQL语句的好处：如果User对象的某些属性为null，则这些属性不会出现在SQL语句中，
            // 从而防止了因Java对象为null而导致数据库默认值失效的问题。
            // 例如，数据库中的用户角色、用户状态、创建时间等字段可能有默认值，
            // 但如果Java对象中的对应属性为null，则会导致插入null值，从而覆盖数据库的默认值。

            List<String> columns = new ArrayList<>(); // 用于存储将要插入的列名
            List<Object> params = new ArrayList<>(); // 用于存储将要插入的值

            // 逐个判断User对象的属性是否为null，如果不为null，则将其列名和值分别添加到columns和params列表中
            if (Objects.nonNull(user.getUsername())) {
                columns.add("username");
                params.add(user.getUsername());
            }
            if (Objects.nonNull(user.getPassword())) {
                columns.add("password");
                params.add(user.getPassword());
            }
            if (Objects.nonNull(user.getRole())) {
                columns.add("role");
                params.add(user.getRole().name()); // 假设Role是一个枚举类型，这里将其转换为字符串
            }
            if (Objects.nonNull(user.getRealName())) {
                columns.add("real_name");
                params.add(user.getRealName());
            }
            if (Objects.nonNull(user.getEmail())) {
                columns.add("email");
                params.add(user.getEmail());
            }
            if (Objects.nonNull(user.getPhone())) {
                columns.add("phone");
                params.add(user.getPhone());
            }
            if (Objects.nonNull(user.getStatus())) {
                columns.add("status");
                params.add(user.getStatus());
            }
            if (Objects.nonNull(user.getCreateTime())) {
                columns.add("create_time");
                params.add(user.getCreateTime());
            }

            // 如果没有任何字段需要插入，则抛出异常
            if (columns.isEmpty()) {
                throw new JdbcException("插入失败：No fields to insert"); // 注意：这里应该是自定义异常，原代码中的JdbcException可能是一个笔误
            }

            // 动态拼接SQL语句
            // 使用String.join和Collections.nCopies方法动态生成列名和占位符
            String sql = "insert into user (" + String.join(", ", columns) + ") " +
                    "values (" + String.join(", ", Collections.nCopies(columns.size(), "?")) + ")";

            // 调用工具类执行SQL语句，并返回受影响的行数
            return JdbcUtil.executeUpdate(sql, params.toArray());
        }

    @Override
    public int deleteById(Integer id) {
        String sql="delete from user where id=?";
        return JdbcUtil.executeUpdate(sql,id);
    }

    @Override
    public int update(User user) {
        //id都为空直接抛出异常
        if(Objects.isNull(user.getId())){
            //抛出自定义的运行时异常
            throw new JdbcException("id is null");
        }
        //1=1没有意义，为了防止没有set语法出错
        StringBuilder sql=new StringBuilder("update user set id=id,");
        //不确定有几个？，创建动态数组，存储sql参数
        List<Object> params=new ArrayList<>();
        //拼接字符串首行保留空格，结尾保留逗号
        if(Objects.nonNull(user.getUsername())){
            sql.append(" username=?,");
            params.add(user.getUsername());
        }
        if(Objects.nonNull(user.getPassword())){
            sql.append(" password=?,");
            params.add(user.getPassword());
        }
        if(Objects.nonNull(user.getRole())){
            sql.append(" role=?,");
            params.add(user.getRole().name());
        }
        if(Objects.nonNull(user.getRealName())){
            sql.append(" real_name=?,");
            params.add(user.getRealName());
        }
        if(Objects.nonNull(user.getEmail())){
            sql.append(" email=?,");
            params.add(user.getEmail());
        }
        if(Objects.nonNull(user.getPhone())){
            sql.append(" phone=?,");
            params.add(user.getPhone());
        }
        if(Objects.nonNull(user.getStatus())){
            sql.append(" status=?,");
            params.add(user.getStatus().name());
        }
        //去除最后一个逗号
//        sql= new StringBuilder(sql.substring(0, sql.length() - 1));
        //确保多余的，在最后一个符号上
        sql.deleteCharAt(sql.length()-1);
        //拼接where条件
        sql.append(" where id=?");
        params.add(user.getId());
        return JdbcUtil.executeUpdate(sql.toString(), params.toArray());
    }

    static final ResultSetHandler<User> handler= rs -> {
        User user=new User();
        user.setId(rs.getInt("id"));
        user.setUsername(rs.getString("username"));
        user.setPassword(rs.getString("password"));
        user.setRole(rs.getString("role")==null?null: UserRole.valueOf(rs.getString("role")));
        user.setRealName(rs.getString("real_name"));
        user.setEmail(rs.getString("email"));
        user.setPhone(rs.getString("phone"));
        user.setStatus(rs.getString("status")==null?null: UserStatus.valueOf(rs.getString("status")));
        user.setCreateTime(rs.getString("create_time")==null?null:rs.getTimestamp("create_time").toLocalDateTime());
        return user;
    };

    @Override
    public User selectById(Integer id) {
        String sql="select * from user where id=?";
        return JdbcUtil.executeQuerySingle(sql,handler,id);
    }

    @Override
    public User selectByUsername(String username) {
        String sql="select * from user where username=?";
        return JdbcUtil.executeQuerySingle(sql,handler,username);
    }

    @Override
    public List<User> selectAll() {
        String sql="select * from user";
        return JdbcUtil.executeQueryList(sql, handler);
    }

    @Override
    public int updateStatus(Integer id, UserStatus status) {
//        User user=selectById(id);
        User user =new User();
        user.setId(id);
        user.setStatus(status);
        return this.update(user);
    }

    @Override
    public boolean existsUsername(String username) {
        //判断用户是否存在
        //直接调用查询方法，判断其返回的user对象是否为空
        return selectByUsername(username)!=null;
    }
}
